Aufgabe ist es aus der Chemotion Repository (https://www.chemotion-repository.net/welcome) alle bisher hinterlegten Substanzen zu klassifizieren und eine deskriptive Statistik des erhaltenen Datensatzes anzufertigen. Hierzu wird im Folgendem das verwendete R-Script beschrieben. Zunächst wird ein R-Skript mit den benötigten Helfer-Funktionen eingelesen, in der benötigte Funktionen ausgelagert werden, um die Vignette übersichtlicher zu gestalten.
source("../Scripts/viz-helper.R")
Die benötigten Pakete müssen geladen werden:
library(readr)
library(rinchi)
library(magrittr)
library(classyfireR)
library(plyr)
library(dplyr)
library(sunburstR)
library(Rcpp)
library(rcdk)
library(ggplot2)
library(plotly)
library(metfRag)
library(data.table)
library(treemap)
Die canonical smiles der Substanzen aus der Chemotion Repository (https://www.chemotion-repository.net/welcome) können als XLSX-Datei heruntergeladen werden. Hierfür muss ein Account auf der Homepage der Chemotion Repository angelegt werden. Unter dem Reiter “My DB” können unter “Chemotion” alle bisher eingetragenen Substanzen markiert und dann als XLSX-Datei exportiert werden. In der heruntergeladenen XLSX-Datei befinden sich anschließend noch Duplikate, sowie Lösungsmittel (solvents) und Reaktionspartner (reactants). Nach Entfernung dieser Substanzen wird die XLSX-Datei in eine CSV-Datei konvertiert und kann dann in R eingelesen werden.
smiles <- as.character(read.csv("../Data/sample_export_16.03.2021_8.12_noDup.csv")[["canonical.smiles"]])
head(smiles,3)
## [1] "NNc1ccc(cc1)Br.Cl"
## [2] "CC1=Nc2c(C1(C)C)cc(cc2)/C=C/C(C(C(C(C(C(C(F)(F)F)(F)F)(F)F)(F)F)(F)F)(F)F)(F)F"
## [3] "C[N+]1=C(C)C(c2c1ccc(c2)/C=C/C(C(C(C(F)(F)F)(F)F)(F)F)(F)F)(C)C.[I-]"
Mit dem Paket “rinchi” (https://rdrr.io/github/CDK-R/rinchi/man/getinchi.html#heading-0) werden nun die canonical smiles in InChikeys konvertiert, damit diese zur Klassifizierung notwenig sind.
inchikey <-sapply(smiles, get.inchi.key)
Im nächsten Schritt werden die InChiKeys verwendet, um eine Klassifizierung der Substanzen durchzuführen. Die Klassifizierung erfolgt mit dem Paket “classyfireR” (https://github.com/aberHRML/classyfireR). Die Funktion “get_classification” erzeugt ein JSON-Objekt für jede Substanz. Aus diesem Objekt können zum Beispiel Metadaten und die hierarchischen Klassifizierungsstufen ausgelesen werden. Für Substanzen die nicht klassifiziert werden konnten wird ein Objekt vom Typ “NULL” erzeugt.
Classification_List <- sapply(inchikey, get_classification)
head(Classification_List,1)
## $`NNc1ccc(cc1)Br.Cl`
## ── ClassyFire Object ───────────────────────────────────── classyfireR v0.3.6 ──
## Object Size: 12.2 Kb
##
## Info:
## ● InChIKey=RGGOWBBBHWTTRE-UHFFFAOYSA-N
##
## ● Cl.NNC1=CC=C(Br)C=C1
##
## ● Classification Version: 2.1
##
## kingdom : Organic compounds
## └─superclass : Benzenoids
## └─class : Benzene and substituted derivatives
## └─subclass : Phenylhydrazines
Das erhaltene JSON Objekt aus ClassyfierR muss so formatiert werden, dass am Ende ein Datenframe mit der hierarischen Klassifizierung der Substanzen ausgestattet ist. Hierzu wurde eine Funktion classyfire2df() geschrieben, die als Eingabe die Classification_List und als Ausgabe einen Datenframe hat:
class <- vector("character", length(Classification_List[]))
df <- classyfire2df()
df
Anzahl der zu klassifizierenden Substanzen aus der Chemotion Repository (Größe des Datensatzes):
## [1] 2343
In dem erzeugten Dataframe stehen in den Spalten der jeweilige Klassifizierungsgrad und in den Reihen die jeweilige Substanz. Im ersten Schritt wird eine neue Spalte “classes” erzeugt, in der alle Spalten mit den Klassifizierungsgraden einer Substanz zusammengefasst werden und mit einem Semikolon getrennt werden. Im nächsten Schritt werden alle SPalten, außer die “classes”-Spalte gelöscht und die hierarisch angelegten Substanzklassen nach Anzahl aufsummiert. Klassifizierungsgrade, die in ihrem Namen einen Bindestrich haben, werden im folgenden Sunburst-Plot nicht richtig geplotted, deshalb werden die Bindestriche in Unterstriche umgewandelt.
col_names <- rename(df, kingdom=1,superclass=2, class=3, subclass=4, level5=5,level6=6, level7=7,level8=8, level9=9)
df <- col_names %>% dplyr::filter(!(kingdom==""))
df <- df %>% dplyr::filter(!(kingdom=="Inorganic compounds"))
df$classes <- gsub('; NA','', paste(df$"superclass",df$"class", df$"subclass", df$"level5", df$"level6", df$"level7",df$"level8" ,df$"level9", sep = "; "))
df <-ddply(df,.(classes),summarize, size=length(classes) )
Anzahl der erfolgreich klassifizierten Substanzen, sowie der nicht klassifizierbaren Substanzen aus der Chemotion Repository:
## [1] 2321
## [1] 22
Mithilfe dieses Data Frames kann die Darstellung des Klassifizierungslevel “class” aller klassifizierten Substanzen prozentual als Sunburst-Plot erfolgen. Die Erstellung des Sunburst Plots erfolgte mit dem Paket “sunburstR” (https://github.com/timelyportfolio/sunburstR)
d3_tree <- sunburstR:::csv_to_hier(df,delim = ";")
sunburst(d3_tree, legend = FALSE,colors=c("#ff4040","#ff423d","#ff453a","#ff4838","#fe4b35","#fe4e33","#fe5130","#fd542e","#fd572b","#fc5a29","#fb5d27","#fa6025","#f96322","#f96620","#f7691e","#f66c1c","#f56f1a","#f47218","#f37517","#f17815","#f07c13","#ee7f11","#ed8210","#eb850e","#e9880d","#e88b0c","#e68e0a","#e49209","#e29508","#e09807","#de9b06","#dc9e05","#d9a104","#d7a403","#d5a703","#d2aa02","#d0ad02","#ceb001","#cbb301","#c9b600","#c6b800","#c3bb00","#c1be00","#bec100","#bbc300","#b8c600","#b6c900","#b3cb01","#b0ce01","#add002","#aad202","#a7d503","#a4d703","#a1d904","#9edc05","#9bde06","#98e007","#95e208","#92e409","#8ee60a","#8be80c","#88e90d","#85eb0e","#82ed10","#7fee11","#7cf013","#78f115","#75f317","#72f418","#6ff51a","#6cf61c","#69f71e","#66f920","#63f922","#60fa25","#5dfb27","#5afc29","#57fd2b","#54fd2e","#51fe30","#4efe33","#4bfe35","#48ff38","#45ff3a","#42ff3d","#40ff40","#3dff42","#3aff45","#38ff48","#35fe4b","#33fe4e","#30fe51","#2efd54","#2bfd57","#29fc5a","#27fb5d","#25fa60","#22f963","#20f966","#1ef769","#1cf66c","#1af56f","#18f472","#17f375","#15f178","#13f07c","#11ee7f","#10ed82","#0eeb85","#0de988","#0ce88b","#0ae68e","#09e492","#08e295","#07e098","#06de9b","#05dc9e","#04d9a1","#03d7a4","#03d5a7","#02d2aa","#02d0ad","#01ceb0","#01cbb3","#00c9b6","#00c6b8","#00c3bb","#00c1be","#00bec1","#00bbc3","#00b8c6","#00b6c9","#01b3cb","#01b0ce","#02add0","#02aad2","#03a7d5","#03a4d7","#04a1d9","#059edc","#069bde","#0798e0","#0895e2","#0992e4","#0a8ee6","#0c8be8","#0d88e9","#0e85eb","#1082ed","#117fee","#137cf0","#1578f1","#1775f3","#1872f4","#1a6ff5","#1c6cf6","#1e69f7","#2066f9","#2263f9","#2560fa","#275dfb","#295afc","#2b57fd","#2e54fd","#3051fe","#334efe","#354bfe","#3848ff","#3a45ff","#3d42ff","#4040ff","#423dff","#453aff","#4838ff","#4b35fe","#4e33fe","#5130fe","#542efd","#572bfd","#5a29fc","#5d27fb","#6025fa","#6322f9","#6620f9","#691ef7","#6c1cf6","#6f1af5","#7218f4","#7517f3","#7815f1","#7c13f0","#7f11ee","#8210ed","#850eeb","#880de9","#8b0ce8","#8e0ae6","#9209e4","#9508e2","#9807e0","#9b06de","#9e05dc","#a104d9","#a403d7","#a703d5","#aa02d2","#ad02d0","#b001ce","#b301cb","#b600c9","#b800c6","#bb00c3","#be00c1","#c100be","#c300bb","#c600b8","#c900b6","#cb01b3","#ce01b0","#d002ad","#d202aa","#d503a7","#d703a4","#d904a1","#dc059e","#de069b","#e00798","#e20895","#e40992","#e60a8e","#e80c8b","#e90d88","#eb0e85","#ed1082","#ee117f","#f0137c","#f11578","#f31775","#f41872","#f51a6f","#f61c6c","#f71e69","#f92066","#f92263","#fa2560","#fb275d","#fc295a","#fd2b57","#fd2e54","#fe3051","#fe334e","#fe354b","#ff3848","#ff3a45","#ff3d42","#ff4040"))
sund2b(d3_tree,colors = htmlwidgets::JS("d3.scaleOrdinal(d3.schemeCategory20b)"))
Darstellung der Substanzklasse “superclass” als Treemap:
tm <- treemap(
tm_func(),
index = c("2"),
vSize="size",
type = "value",
title = "Treemap of the superclasses in the dataset")
tm2 <- treemap(
tm_func(),
index = c("3"),
vSize="size",
type = "value",
title = "Treemap of the classes in the dataset")
tm3 <- treemap(
tm_func(),
index = c("2","3"),
vSize="size",
type = "value",
title = "Treemap of the superclasses and classes in the dataset")
Darstellung der superclasses als Barplot:
bar <- ggplot(bar_func(),aes(size,reorder(classes, size, sum)))+
geom_col(fill="darkblue")+
labs(y= "superclasses", x = "count")
ggplotly(bar)
Neben der Darstellung der prozentualen Anteile der Substanzklassen können mithilfe des Paketes “rcdk” (https://cran.r-project.org/web/packages/rcdk/index.html) die molaren Massen der Substanzen aus den canonical smiles berechnet werden. Der erstellte Dataframe zeigt die ersten drei Substanzen aus dem Datensatz mit der jeweiligen exakten molaren Masse [g/mol] an.
substance_mass <- sapply(smiles, smiles2mass)
df_mass <- data.frame(substance_mass)
mass <- data.frame(substance= row.names(df_mass), df_mass, row.names=NULL)
head(mass,3)
Mit dem Paket “ggplot2” (https://www.rdocumentation.org/packages/ggplot2/versions/3.3.3) kann ein Histogramm der molaren Massen erstellt werden und mit dem Paket “ggplotly” (https://www.rdocumentation.org/packages/plotly/versions/4.9.3/topics/ggplotly) wird der erstellte Plot interaktiv nutzbar:
histogram <- ggplot(mass,aes(substance_mass))+
geom_histogram(binwidth=20,color="darkblue", fill="lightblue")+
labs(title="Histogram plot: Molar mass vs count",x="Exact mass (g/mol)", y = "Count")
ggplotly(histogram)
Weiterhin kann ein hierarchischen Clusterings der Substanzen mit dem Paket ‘metfRag’(https://github.com/ipb-halle/MetFragR) dargestellt werden. Diese Darstellung zeigt das Cluster von den Substanzen nach strukturellen Ähnlichkeiten:
mols <- parse.smiles(smiles)
dummy <- mapply(set.property, mols, "Score", c(1:2343))
plotCluster(mols, h=0.2)
Sessioninfo:
sessionInfo()
## R version 4.0.5 (2021-03-31)
## Platform: x86_64-pc-linux-gnu (64-bit)
## Running under: Ubuntu 20.04.2 LTS
##
## Matrix products: default
## BLAS: /usr/lib/x86_64-linux-gnu/blas/libblas.so.3.9.0
## LAPACK: /usr/lib/x86_64-linux-gnu/lapack/liblapack.so.3.9.0
##
## locale:
## [1] LC_CTYPE=de_DE.UTF-8 LC_NUMERIC=C
## [3] LC_TIME=de_DE.UTF-8 LC_COLLATE=de_DE.UTF-8
## [5] LC_MONETARY=de_DE.UTF-8 LC_MESSAGES=de_DE.UTF-8
## [7] LC_PAPER=de_DE.UTF-8 LC_NAME=de_DE.UTF-8
## [9] LC_ADDRESS=de_DE.UTF-8 LC_TELEPHONE=de_DE.UTF-8
## [11] LC_MEASUREMENT=de_DE.UTF-8 LC_IDENTIFICATION=de_DE.UTF-8
##
## attached base packages:
## [1] stats graphics grDevices utils datasets methods base
##
## other attached packages:
## [1] treemap_2.4-2 data.table_1.14.0 metfRag_2.4.2 fingerprint_3.5.7
## [5] rjson_0.2.20 plotly_4.9.3 ggplot2_3.3.3 rcdk_3.5.0
## [9] rcdklibs_2.3 rJava_0.9-13 Rcpp_1.0.6 sunburstR_2.1.5
## [13] dplyr_1.0.5 plyr_1.8.6 classyfireR_0.3.6 magrittr_2.0.1
## [17] rinchi_0.5 readr_1.4.0
##
## loaded via a namespace (and not attached):
## [1] httr_1.4.2 sass_0.3.1 tidyr_1.1.3 jsonlite_1.7.2
## [5] viridisLite_0.3.0 bslib_0.2.4 shiny_1.6.0 assertthat_0.2.1
## [9] highr_0.8 yaml_2.2.1 pillar_1.5.1 glue_1.4.2
## [13] digest_0.6.27 RColorBrewer_1.1-2 promises_1.2.0.1 colorspace_2.0-0
## [17] htmltools_0.5.1.1 httpuv_1.6.0 clisymbols_1.2.0 pkgconfig_2.0.3
## [21] purrr_0.3.4 xtable_1.8-4 scales_1.1.1 itertools_0.1-3
## [25] later_1.1.0.1 tibble_3.1.0 generics_0.1.0 ellipsis_0.3.1
## [29] withr_2.4.1 lazyeval_0.2.2 cli_2.3.1 crayon_1.4.1
## [33] d3r_0.9.1 mime_0.10 evaluate_0.14 fansi_0.4.2
## [37] tools_4.0.5 hms_1.0.0 lifecycle_1.0.0 gridBase_0.4-7
## [41] stringr_1.4.0 munsell_0.5.0 compiler_4.0.5 jquerylib_0.1.4
## [45] rlang_0.4.10 grid_4.0.5 iterators_1.0.13 rstudioapi_0.13
## [49] squash_1.0.9 htmlwidgets_1.5.3 crosstalk_1.1.1 igraph_1.2.6
## [53] labeling_0.4.2 rmarkdown_2.7 gtable_0.3.0 DBI_1.1.1
## [57] curl_4.3 R6_2.5.0 knitr_1.31 fastmap_1.1.0
## [61] utf8_1.2.1 stringi_1.5.3 parallel_4.0.5 vctrs_0.3.6
## [65] png_0.1-7 tidyselect_1.1.0 xfun_0.22